//
//  WBMainViewController.swift
//  Swift微博练习
//
//  Created by 练锦波 on 2016/11/2.
//  Copyright © 2016年 练锦波. All rights reserved.
//

import UIKit

class WBMainViewController: UITabBarController {

    // MARK: - 私有控件
    
    /// 撰写按钮
    fileprivate lazy var composeButton: UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")
    
    override func viewDidLoad() {
        super.viewDidLoad()

        setupChildControllers()
        setupComposeButton()
        // Do any additional setup after loading the view.
    }
    /**
     portrait :竖屏
     landscape:横屏
     
     使用代码控制设备的方向 好处 可以再需要横屏的时候 单独处理
     设置支持的方向之后 当前的控制器及子控制器都会遵守这个方向
     如果播放视频 通常是通过modal 展现的
     */
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        return .portrait
    }
    
    
    // MARK: - 监听方法
    
    /// 撰写微博
    // @objc 允许这个韩式在‘运行时’ 通过 OC 的消息机制被调用!
    @objc fileprivate func composeStatus() {
        print("撰写微博")
    }
    
    
}
    extension WBMainViewController{
        
        /// 设置撰写按钮
        fileprivate func setupComposeButton() {
            tabBar.addSubview(composeButton)
            
            //计算按钮的宽度
            let count = CGFloat(childViewControllers.count)
            // 将向内缩进的宽度减少，能够让按钮的宽度变大，盖住容错点
            let w = tabBar.bounds.width / count - 1
            
            // CGRectInset 正数向内缩进 负数向外扩展
            composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
            
            //添加监听方法
            composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
        }
        
        
        //设置所有子控制器
       fileprivate  func setupChildControllers() {
        
            // 0. 获取沙盒 json 路径
            let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let jsonPath = (docDir as NSString).appendingPathComponent("main.json")
        
            // 加载 data 
            var data = NSData(contentsOfFile: jsonPath)
        
            // 判断 data 是否有内容，如果没有，说明本地沙盒没有文件
        if data == nil {
            // 从bundle 加载 data
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        
            //  反序列化转换成数组
        guard let array = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String: Any]]
            else {
            return
        }
        
        // 遍历数组 循环创建控制器数组
            var arrayM = [UIViewController]()
            for dict in array!{
                arrayM.append(controller(dict: dict))
            }
            viewControllers = arrayM
        }
        
        
        
        /// 使用字典创建一个子控制器
        ///
        /// - parameter dict: 信息字典
        ///
        /// - returns: 子控制器
        private func controller(dict: [String:Any]) -> UIViewController{
            //1. 取得字典
            guard let clsName = dict["clsName"] as? String,
                  let title = dict["title"] as? String,
                  let imageName = dict["imageName"] as? String,
                  let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? WBBaseViewController.Type,
                  let visitor = dict["visitorInfo"] as? [String: String]
            else {
                return UIViewController()
            }
            //2. 创建视图控制器
            let vc = cls.init()
            
            vc.title = title
            
            // 设置访客视图信息
            vc.visitorInfoDictionary = visitor
            
            // 3.设置图像
            vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
            
            vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)
            
            // 4.设置tabbar的标题字体（大小）
            vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.orange], for: .highlighted)
            //系统默认是12号字 修改字体大小 要设置 Normal的字体大小
            vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 12)], for: UIControlState(rawValue: 0))
            
            let nav = WBNavigationController(rootViewController: vc)
            
            return nav
        }
    }


